/*
 * praid.h
 *
 *  Created on: 08/10/2011
 *      Author: Cristian
 */
#include <stdint.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/un.h>
#include <stdio.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <string.h>
#include <ctype.h>
#include "includes/todo_incluido.h"

#include <sys/time.h>

#include <poll.h>
#include <stropts.h>


#define MAXLINE 100
#define MaxPoolSize 100
#define LIBRE 4
#define OCUPADO 5
#define BACKLOG 50
#define PUERTO 2222
#define HANDSHAKE 0
#define LECTURA 1
#define ESCRITURA 2
#define INACTIVO 3
#define DIRECCION_IP "127.0.0.1"
#define FALSO 0
#define VERDADERO 1
#define DELIMITADOR_POOL "MaxPoolSize = "
#define DELIMITADOR_PUERTO "Puerto = "
#define DELIMITADOR_CONSOLA "Consola = "
#define ARCH_CONFIG "settings.cfg"

typedef struct header_mensaje
	{
		uint8_t type;
		uint16_t payloadLength;
		uint32_t sector;
	} __attribute__((packed)) header_mensaje;

typedef struct mensaje
	{
		header_mensaje h;
		char* payload;
	} __attribute__((packed)) mensaje;

typedef struct colaDePedidos{
	mensaje pedido;
	struct ColaDePedidos *proximo;
} __attribute__((packed)) Pedidos;

typedef struct arrConexiones
	{
		uint16_t sockId;
		uint8_t estado;
		struct td_cola *cola;
	} __attribute__((packed)) arrConexiones;

typedef struct infoDeDisco{
		char *idDisco;
		uint16_t sockId;
		uint8_t estado;
		time_t ultimoAcceso;
	} __attribute__((packed)) InfoDeDisco;

typedef struct NodoDisco {

		struct infoDeDisco info;
		struct NodoDisco *proximo;
	} __attribute__((packed)) NodoDisco;

	/*
typedef struct nuevoProceso {
	uint16_t sockId;
	struct nuevoProceso *proximo;
} __attribute__((packed)) nuevoProceso;
*/

typedef struct param {
	struct arrConexiones *arrayC;
	uint16_t conexiones;		//Len del ArrConexiones
	struct NodoDisco *lstD;
	uint8_t *numDiscos;			//Cantidad de Discos actual
	td_cola *newProcess;
} __attribute__((packed)) param;

typedef struct pedidoPFS{
	param *t_param;
	int8_t pos;
}__attribute__((packed)) pedidoPFS;

typedef struct config{
	int16_t v_consola;
	int16_t v_puerto;
	int16_t v_pool;
} __attribute__((packed)) config;

typedef struct param_escucha{
	td_cola *nuevo_p;
	config cfg;
	struct arrConexiones arrayC;
} __attribute__((packed)) param_escucha;


void *AnalizarNuevosClientes(void* arg);

void InicializarArrayDeConexiones(uint16_t cant, struct arrConexiones *array,config param_cfg);

void *ListenNewProcesses(void *arg);

int16_t BuscarSocketLibre (struct arrConexiones *arrayC, uint8_t cant);

void *AtenderPedidos(void *arg);

void LeerArchivoDeConfiguracion (config *param_cfg);

//void InsertarNuevoNodoProceso (uint16_t sock, nuevoProceso **p);

void eliminarPrimerNodoProceso(struct param **p);

void InsertarNodoDisco (struct infoDeDisco info, struct param *p);

void *EncolarPedidos(void* arg);




